//
//  JSSRefreshView.swift
//  WeiBoItem
//
//  Created by jss on 16/4/24.
//  Copyright © 2016年 jss. All rights reserved.
//

import UIKit


//定义枚举 表示刷新状态
enum JSSRefreshViewState: Int {
    
    case Nomal = 0//"默认"
    case Pulling =  1// "松手就去刷新状态"
    case Refrenshing = 2// "刷新中的状态"
    
}

let JSSRefreshViewH: CGFloat = 50

class JSSRefreshView: UIControl {
    

    
    //当前控件的父控件
    var tableview:UIScrollView?
    
    //当前控件的状态
    var refreshState:JSSRefreshViewState = .Nomal {
        
        didSet{
            
            switch refreshState {
                
            case .Pulling:
                
                //如果是拖拽状态让箭头朝上
                UIView.animateWithDuration(0.2, animations: { () -> Void in
                    self.arrowImageView.transform = CGAffineTransformMakeRotation(CGFloat(M_PI))
                    
                })
                arrowLable.text = "松手刷新"
                print("松手刷新")
               
            case .Refrenshing:
                //刷新状态
                //1.箭头隐藏
                self.arrowImageView.hidden = true
                //2.菊花转
                self.indecatorView.startAnimating()
                
                //3.更改文字
                self.arrowLable.text = "正在刷新"
                 print("正在刷新")
                UIView.animateWithDuration(0.3, animations: { () -> Void in
                    
                    //正在刷新的时候 将tableView的内容再整体往下移(就能够看到刷新的菊花在转了)
                    self.tableview?.contentInset.top = self.tableview!.contentInset.top + JSSRefreshViewH
                })
                
                //去调用刷新的方法(通过这个方法我们可以调用控制器里面相应的valueChanged的方法)
                sendActionsForControlEvents(UIControlEvents.ValueChanged)
                
                
            case .Nomal:
                
                //隐藏菊花转(不转状态下自动隐藏)
                self.indecatorView.stopAnimating()
                
                //显示箭头
                self.arrowImageView.hidden = false
                //箭头朝下
                UIView.animateWithDuration(0.2, animations: { () -> Void in
                    
                     self.arrowImageView.transform = CGAffineTransformIdentity
                })
                
                //更改文字
                self.arrowLable.text = "等待刷新"
                 print("等待刷新")
                
                //如果之前是刷新中的状态 那么进入Nomal状态就立即减去顶部多出来的部分
                if oldValue == .Refrenshing {
                    
                    UIView.animateWithDuration(0.2, animations: { () -> Void in
                        
                        self.tableview?.contentInset.top = self.tableview!.contentInset.top - JSSRefreshViewH
                    })
                }
       
            }
        }
        
    }
    
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        
        setupUI()
    }
    
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    private func setupUI() {
        
        //设置背景颜色
        backgroundColor = UIColor.orangeColor()
        
        //设置frame
        self.frame.size.height = JSSRefreshViewH
        self.frame.origin.y = -JSSRefreshViewH
        self.frame.size.width = SCREENW
        
        //添加箭头
        addSubview(arrowImageView)
        //添加文字
        addSubview(arrowLable)
        //添加菊花
        addSubview(indecatorView)
        
        //箭头约束
        arrowImageView.snp_makeConstraints { (make) -> Void in
            make.centerX.equalTo(self).offset(-30)
            make.centerY.equalTo(self)
        }
        //文字约束
        arrowLable.snp_makeConstraints { (make) -> Void in
            make.centerY.equalTo(arrowImageView)
            make.leading.equalTo(arrowImageView.snp_trailing)
        }
        //菊花约束
        indecatorView.snp_makeConstraints { (make) -> Void in
            make.center.equalTo(arrowImageView)
        }
    }
    
    //下面这个方法是将要被添加到父控件上的时候会调用
    override func willMoveToSuperview(newSuperview: UIView?) {
        super.willMoveToSuperview(newSuperview)
        
        print(newSuperview)//这个newSuoerview是UITableView
        
        guard let tableview = newSuperview where tableview.isKindOfClass(UIScrollView.self) else {
            return
        }
        
        self.tableview = tableview as? UIScrollView
        
        self.frame.size.width = tableview.frame.size.width
        
       
        
        //使用KVO  来监听tableView身上的contentOffset的改变 这里需要有一个添加监听者的方法(有监听就有移除)
        //让当前UIControl成为tableView的监听者 监听tableView的contentOffset的变化 然后回调后面的新值和旧值
        tableview.addObserver(self, forKeyPath: "contentOffset", options: [.New,.Old], context: nil)

    }
    
     //当观察的对象身上的属性发生改变的时候 就会回调这个方法
    override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) {
        
        let contentOffset = self.tableview!.contentOffset
        
//        print(change)
        
        //在 iOS 7 之后如果tableView界面有导航条的话，会把tableView的内容整体往下偏移64
        //这里可以打印tableView的top来证明上面的说法
        //print(contentOffset.y)
        
        //当contentOffset.y小于-114的时候 就代表控件全部显示出来
        
        let conditionValue = -tableview!.contentInset.top - JSSRefreshViewH  // -114
        
        //判断用户是否松手 ("用户松手"和 "松手就去刷新")
        if tableview!.dragging {
            
            //用户还在拖动
            //表明控件完全显示出来
            //如果用户在拖动：因为只有在拖动的情况下才会进入 Pulling --> 也只有在拖动的情况才会从 Pulling 状态进行到 Normal 状态
            if contentOffset.y < conditionValue && refreshState == .Nomal {
                print("控件完全显示出来")
                refreshState = .Pulling
                
//                //如果是拖拽状态让箭头朝上
//                UIView.animateWithDuration(0.2, animations: { () -> Void in
//                    self.arrowImageView.transform = CGAffineTransformMakeRotation(CGFloat(M_PI))
//                    
//                })
//                arrowLable.text = "松手刷新"

            }else{
                if contentOffset.y >= conditionValue && refreshState == .Pulling {
                print("控件没有完全显示出来")
                refreshState = .Nomal
                }
                
            }
        }else{
            
            //用户没有拖动 已经松手
            if refreshState == .Pulling{//当状态是正在下拉然后松手的时候才去刷新 状态才是Refrenshing 不然程序已开启还没没动的时候 就会显示正在刷新 因为没有拖拽屏幕  所以这里加个判断  是状态必须在下拉松手后 才是正在刷新状态
                
                print("控件正在刷新中")
                refreshState = .Refrenshing
                
//                //刷新状态  
//                //1.箭头隐藏
//               self.arrowImageView.hidden = true
//                //2.菊花转
//               self.indecatorView.startAnimating()
//            
//                //3.更改文字
//                self.arrowLable.text = "正在刷新"
//                //4.
//                UIView.animateWithDuration(0.2, animations: { () -> Void in
//                    
//                })
                
            }
        }
    }
    
    //结束刷新
    func endRefrensh(){
        
        refreshState = .Nomal
    }
    
    //移除监听者
    deinit {
        tableview?.removeObserver(self, forKeyPath: "contentOffset")
    }
    
    //添加刷新控件上的子控件
    //箭头
    private lazy var arrowImageView:UIImageView = {
    
        let arrow = UIImageView(image: UIImage(named: "tableview_pull_refresh"))
        
        return arrow
    
    }()
    //lable(文字)
    private lazy var arrowLable:UILabel = {
    
    let lable = UILabel(textColor: UIColor.darkGrayColor(), textFont: 14)
        lable.text = "等待刷新"
        return lable
        
    }()
    
    //刷新的时候 菊花
    private lazy var indecatorView:UIActivityIndicatorView = UIActivityIndicatorView()

}
